<?php
/**
 * 23、设计模式学习-解释器模式
 * 字符串过滤控制器
 * 依次：过滤空格、制表符、HTML 标签
 * 2020年1月8日15:36:35
 */
namespace Application\Controller;

class StringInterpreterController extends BaseController
{
    // 没有使用解释器模式，字符串多次过滤
    public function noUseInterpreter()
    {
        $string = '字符串原有格式：带有空格 、回车
            HTML 标签<hr />';
        echo '打印原来字符串：';
        export($string);
        // 过滤
        $search = array(
            ' ', # 空格
            "\n", # 换行
            "\r", # 回车
        );
        $string = str_replace($search,'',$string);
        $string = strip_tags($string);
        echo '打印处理后的字符串：';
        export($string);
        // 总结：简单易行，不过较为耦合，不够灵活
    }
    // 使用解释器模式，字符串多次过滤
    public function useInterpreter()
    {
        $string = "字符串原有格式：带有空格 、回车
            HTML 标签<hr />";
        echo '打印原来的字符串：';
        export($string);
        $space_interpreter = new \Application\Common\Interpreter\SpaceInterpreter();
        $enter_interpreter = new \Application\Common\Interpreter\EnterInterpreter();
        $html_interpreter = new \Application\Common\Interpreter\HtmlInterpreter();
        $interpreter_manager = new \Application\Common\Interpreter\InterpreterManager();
        $interpreter_manager -> add($space_interpreter);
        $interpreter_manager -> add($enter_interpreter);
        $interpreter_manager -> add($html_interpreter);
        // 执行操作
        $string = $interpreter_manager -> handle($string);
        echo '打印处理后的字符串：';
        export($string);
        // 总结：代码相对较为复杂，但易于扩展，且灵活多变
    }
}
